﻿using System.Linq;
using AbcCorp.DTO;
using DAO.EntityModel;

namespace AbcCorp.DAO
{
    public class AccountDao
    {
        #region Variable
        /// <summary>
        /// Khai báo tượng entity model
        /// </summary>
        private readonly ABCCorpEntities _abcCorpEntities = new ABCCorpEntities();
        #endregion

        #region Methods
        /// <summary>
        /// Đăng nhập
        /// </summary>
        /// <param name="username">Tài khoản</param>
        /// <param name="password">Mật khẩu</param>
        /// <returns>Tài khoản (Account)</returns>
        public AccountDto SignIn(string username, string password)
        {
            var passwordEncryt = Utility.EncodeString.Md5Encode(password);
            var accountinfo =
                from acc in
                    _abcCorpEntities.Accounts.Where(a => a.Username.Equals(username) && a.Password.Equals(passwordEncryt))
                select acc;
            var account = accountinfo.SingleOrDefault();
            if (account == null) return null;
            var accountDto = new AccountDto();
            CopyObject<Account, AccountDto>.CopyProperties(account, accountDto); 
            return accountDto;
        }

        /// <summary>
        /// Đăng ký
        /// </summary>
        /// <param name="newAccount">Thông tin tài khoản mới</param>
        /// <returns>Giá trị âm nếu thất bại, ngược lại nếu thành công</returns>
        public bool SignUp(AccountDto newAccount)
        {
            var passwordEncryt = Utility.EncodeString.Md5Encode(newAccount.Password);
            var info = from acc in _abcCorpEntities.Accounts.Where
                               (
                                    a => a.Username.Equals(newAccount.Username) ||
                                        a.Email.Equals(newAccount.Email)
                               )
                       select acc;

            if (info.FirstOrDefault() != null) return false;
            
            var account = new Account();
            newAccount.Password = passwordEncryt;
            newAccount.IsAdmin = false;
            CopyObject<AccountDto, Account>.CopyProperties(newAccount, account);
            _abcCorpEntities.Accounts.AddObject(account);
            _abcCorpEntities.SaveChanges();
            return true;
        }

        /// <summary>
        /// Lấy lại mật khẩu
        /// </summary>
        public string GetPassword(string username, string email)
        {
            var account =
                from acc in _abcCorpEntities.Accounts.Where(a => a.Username.Equals(username) && a.Email.Equals(email))
                select acc;
            return account.ToList()[0].Password ?? "";
        }

        /// <summary>
        /// Thay đổi mật khẩu
        /// </summary>
        /// <param name="username">Tài khoản</param>
        /// <param name="email">Email</param>
        /// <param name="password">Mật khẩu cũ</param>
        /// <param name="newpassword">Mật khẩu mới</param>
        public bool UpdatePassword(string username, string email, string password, string newpassword)
        {
            var passwordEncryt = Utility.EncodeString.Md5Encode(password);

            var account = from acc in _abcCorpEntities.Accounts.Where
                              (
                                  a => a.Username.Equals(username) &&
                                       a.Password.Equals(passwordEncryt) &&
                                       a.Email.Equals(email)
                              )
                          select acc;

            var result = account.SingleOrDefault();

            if (result == null) return false;

            result.Password = Utility.EncodeString.Md5Encode(newpassword);
            return _abcCorpEntities.SaveChanges() > 0;
        }

        /// <summary>
        /// Thay đổi mật khẩu khi người dùng sử dụng chức năng lấy lại mật khẩu
        /// </summary>
        /// <param name="code">Mã người dùng nhận được khi eyeeu cầu lấy lại mật khẩu</param>
        /// <param name="newPassword">Mật khẩu mới</param>
        public bool UpdatePasswordByCode(string code, string newPassword)
        {
            var account = from acc in _abcCorpEntities.Accounts.Where(a => a.Password.Equals(code))
                          select acc;

            var result = account.SingleOrDefault();
            if (result == null) return false;

            result.Password = Utility.EncodeString.Md5Encode(newPassword);
            return _abcCorpEntities.SaveChanges() > 0;
        }

        /// <summary>
        /// Lấy mã tài khoản
        /// </summary>
        /// <param name="username">Tài khoản</param>
        /// <returns>Mật khẩu (string)</returns>
        public int GetAccountId(string username)
        {
            var accountinfo = from acc in _abcCorpEntities.Accounts.Where(a => a.Username.Equals(username))
                          select acc;
            var account = accountinfo.SingleOrDefault();
            return account == null ? 0 : account.AccountID;
        }
    }
    #endregion
}
